package com.xxgc.demo.controller.aop;

import com.xxgc.demo.controller.error.myerror.IdCardDateException;
import com.xxgc.demo.controller.vo.NameAuthenticationVO;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.springframework.stereotype.Component;

import java.text.SimpleDateFormat;
import java.util.Date;

/**
 * @Author: SJY
 * @Date :2023/9/11 - 09 - 11 - 11:49
 * 用户身份证号时间校验aop
 */
//@Aspect 这是一个aop标识  @Component把对象交给spring容器进行托管
@Aspect
@Component
public class UserIdCardDateAOP {
    //1、拦截到参数
    //2、获取idCard
    //3、如果不对原地报错（自定义异常）
    //4、由全局异常拦截接管，并向前端返回参数校验异常

    //切点表达式
    @Around("execution (* com.xxgc.demo.controller.Demo2Controller.realNameAuthentication(..))")
    public Object userIdCard(ProceedingJoinPoint proceedingJoinPoint) throws Throwable {
        System.out.println("这个方法拦截成功");
        // 获取被拦截方法的参数
        Object[] args = proceedingJoinPoint.getArgs();

        // 转换参数为 User 对象
        NameAuthenticationVO nameAuthenticationVO = (NameAuthenticationVO) args[0];
        //获取身份证
        //510122202510201130
        String idCard = nameAuthenticationVO.getIdCard();
        //截取身份证中的日期
        String idCardDateStr = idCard.substring(6, 14);
        SimpleDateFormat idCardDateFormat = new SimpleDateFormat("yyyymmdd");
        Date idCardDate = idCardDateFormat.parse(idCardDateStr);
        //比较身份证时间和当前时间
        if (idCardDate.after(new Date())) {
            // 如果身份证上的时间大于当前时间，则该身份证无效
            System.out.println("该身份证无效，因为身份证上的时间大于当前时间");
            // 抛异常
            throw new IdCardDateException("/realNameAuthentication","身份证时间不能大于当前时间");
        }
        System.out.println("idCard = " + idCard);
        return proceedingJoinPoint.proceed();
    }

}
